package com.aaa.exception;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import com.aaa.entity.Result;

/**
 * 全局异常处理器，用于捕获并处理控制器层抛出的异常
 */
@RestControllerAdvice
public class GlobalExceptionHandler {

    // 初始化日志记录器，用于记录异常信息，方便后续排查问题
    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    /**
     * 处理空指针异常的方法。
     * 当控制器层抛出 NullPointerException 时，该方法会被触发。
     *
     * @param e 捕获到的空指针异常对象
     * @return 返回一个统一格式的 Result 对象，包含错误信息，提示用户发生了空指针异常并检查数据
     */
    @ExceptionHandler(NullPointerException.class)
    public ResponseEntity<Result> handleNullPointerException(NullPointerException e) {
        // 使用日志记录器记录错误信息，包括异常类型和异常堆栈信息
        logger.error("全局异常处理：空指针异常", e);
        // 调用 Result 类的 error 方法，返回包含错误信息的 Result 对象
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                .body(Result.internalError("发生空指针异常，请检查数据"));
    }

    /**
     * 处理参数非法异常的方法。
     * 当控制器层抛出 IllegalArgumentException 时，该方法会被触发。
     *
     * @param e 捕获到的参数非法异常对象
     * @return 返回一个统一格式的 Result 对象，包含错误信息，提示用户输入的参数不合法并检查
     */
    @ExceptionHandler(IllegalArgumentException.class)
    public ResponseEntity<Result> handleIllegalArgumentException(IllegalArgumentException e) {
        logger.error("全局异常处理：参数非法异常", e);
        return ResponseEntity.status(HttpStatus.BAD_REQUEST)
                .body(Result.paramError("输入的参数不合法，请检查"));
    }

    /**
     * 处理其他未知异常的方法。
     * 当控制器层抛出除了已处理的异常之外的其他异常时，该方法会被触发。
     *
     * @param e 捕获到的未知异常对象
     * @return 返回一个统一格式的 Result 对象，包含错误信息
     */
    @ExceptionHandler(Exception.class)
    public ResponseEntity<Result> handleException(Exception e) {
        logger.error("全局异常处理：未知异常", e);
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                .body(Result.internalError("操作失败，请稍后重试"));
    }
}